package com.atguigu.ssyx.acl.utils;

import com.atguigu.ssyx.model.acl.Permission;

import java.util.ArrayList;
import java.util.List;

public class PermissionHelper {

    /**
     * 使用递归方法创建菜单
     *
     * @param treeNodes 节点树列表
     * @return
     */
    public static List<Permission> build(List<Permission> treeNodes) {
        ArrayList<Permission> trees = new ArrayList<>();
        for (Permission treeNode : treeNodes) {
            // 如果是根节点，没有父节点，则设置其为第一层
            if (treeNode.getPid() == 0) {
                treeNode.setLevel(1);
                // 递归查找子节点，并设置到树中
                trees.add(findChildren(treeNode, treeNodes));
            }
        }
        return trees;
    }

    /**
     * 递归查找子节点
     *
     * @param treeNode  父节点
     * @param treeNodes 列表
     * @return
     */
    private static Permission findChildren(Permission treeNode, List<Permission> treeNodes) {

        treeNode.setChildren(new ArrayList<Permission>());

        for (Permission node : treeNodes) {
            // 找到传入节点的子节点
            if (treeNode.getId().longValue() == node.getPid().longValue()) {
                // 设置子节点层级
                int childLevel = treeNode.getLevel() + 1;
                node.setLevel(childLevel);
                // 递归
                treeNode.getChildren().add(findChildren(node, treeNodes));
            }
        }
        // 返回处理好的节点
        return treeNode;
    }
}
